package com.xbai.config;

import com.xbai.bean.LifeCycleBean;
import com.xbai.bean.MyBeanPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * bean 的生命周期：bean创建 --- 初始化 --- 销毁的过程
 * 容器管理 bean 的生命周期；
 * 我们可以自定义初始化和销毁方法，容器在 bean 进行到生命周期的时候来调用我们自定义的初始化和销毁方法
 *
 * 构造（对象创建）
 *      单实例：在容器启动的时候创建对象
 *      多实例：在每次获取的时候创建
 * 初始化：对象创建完成，并赋值好，调用初始化方法
 * 销毁：
 *      单实例：容器关闭的时候
 *      多实例：容器不会管理这个 bean；容器不会调用销毁方法；
 *
 * 1)、指定初始化和销毁方法
 *      xml方式：指定 init-method  和 destroy-method
 *      注解方式：通过 @Bean 指定 init-method  和 destroy-method
 * 2)、通过让 bean 实现 InitializingBean（自定义初始化逻辑）、DisposableBean（定义销毁逻辑）
 * 3)、可以使用 JSR250
 *      @PostConstruct：在 bean 创建完成并且属性赋值完成，来执行初始化方法
 *      @PreDestroy：在容器销毁 bean 之前通知我们进行清理工作
 * 4)、@BeanPostProcessor：bean 的后置处理器，在 bean 初始化前后进行一些处理工作
 *      postProcessBeforeInitialization：在初始化之前工作
 *      postProcessAfterInitialization：在初始化之后工作
 *
 */
@Configuration
//@ComponentScan("com.xbai.bean")
public class MainConfigOfLifeCycle {

    @Bean(initMethod = "initMethod", destroyMethod = "destroyMethod")
    public LifeCycleBean lifeCycleBean() {
        return new LifeCycleBean();
    }

    @Bean
    public MyBeanPostProcessor myBeanPostProcessor() {
        return new MyBeanPostProcessor();
    }

    /*@Bean(initMethod = "init", destroyMethod = "destroy")
    public Car car() {
        return new Car();
    }*/

}
